//package com.mornstar.econvent.auth.utils;
//
//import com.mornstar.common.enums.constant.StringPool;
//import com.mornstar.common.utils.Charsets;
//import com.mornstar.common.utils.WebUtil;
//import com.mornstar.econvent.auth.TokenInfo;
//import com.mornstar.log.exception.SecureException;
//import io.jsonwebtoken.JwtBuilder;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.SignatureAlgorithm;
//import lombok.SneakyThrows;
//
//import javax.crypto.spec.SecretKeySpec;
//import java.security.Key;
//import java.util.Base64;
//import java.util.Date;
//import java.util.Map;
//import java.util.Objects;
//
//public class JwtUtils {
//    /**
//     * 创建令牌
//     *
//     * @param user      user
//     * @param audience  audience
//     * @param issuer    issuer
//     * @param tokenType tokenType
//     * @return jwt
//     */
//    public static TokenInfo createJWT(Map<String, Object> user, String audience, String issuer, String tokenType) {
//        return createJWT(user, audience, issuer, tokenType, null);
//    }
//
//    /**
//     * 创建令牌
//     *
//     * @param user         user
//     * @param audience     audience
//     * @param issuer       issuer
//     * @param tokenType    tokenType
//     * @param expireMillis expireMillis
//     * @return jwt
//     */
//    public static TokenInfo createJWT(Map<String, Object> user, String audience, String issuer, String tokenType, Long expireMillis) {
//
//        String[] tokens = extractAndDecodeHeader();
//        String clientId = tokens[0];
//        String clientSecret = tokens[1];
//
//        // 获取客户端信息
//        IClientDetails clientDetails = clientDetails(clientId);
//
//        // 校验客户端信息
//        if (!validateClient(clientDetails, clientId, clientSecret)) {
//            throw new SecureException("客户端认证失败, 请检查请求头 [Authorization] 信息");
//        }
//
//        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//
//        long nowMillis = System.currentTimeMillis();
//        Date now = new Date(nowMillis);
//
//        //生成签名密钥
//        byte[] apiKeySecretBytes = Base64.getDecoder().decode(JwtUtil.getBase64Security());
//        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
//
//        //添加构成JWT的类
//        JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT") // 头部
//                .setIssuer(issuer)
//                .setAudience(audience)
//                .signWith(signingKey); // 签名算法
//
//        //设置JWT参数
//        user.forEach(builder::claim);
//
//        //设置应用id
//        builder.claim(CLIENT_ID, clientId); // 设置负载，自定义内容
//
//        long expMillis = nowMillis + expireMillis;
//        Date exp = new Date(expMillis);
//        builder.setExpiration(exp).setNotBefore(now); // 设置过期时间
//
//        //组装Token信息
//        TokenInfo tokenInfo = new TokenInfo();
//        tokenInfo.setToken(builder.compact());
//        tokenInfo.setExpire((int) (expireMillis / 1000L));
//
//        return tokenInfo;
//    }
//
//    /**
//     * 客户端信息解码
//     */
//    @SneakyThrows
//    public static String[] extractAndDecodeHeader() {
//        // 获取请求头客户端信息
//        String header = "" ; //Objects.requireNonNull(WebUtil.getRequest()).getHeader(SecureConstant.BASIC_HEADER_KEY);
////        header = Func.toStr(header).replace(SecureConstant.BASIC_HEADER_PREFIX_EXT, SecureConstant.BASIC_HEADER_PREFIX);
////        if (!header.startsWith(SecureConstant.BASIC_HEADER_PREFIX)) {
////            throw new SecureException("未获取到请求头[Authorization]的信息");
////        }
//        byte[] base64Token = header.substring(6).getBytes(Charsets.UTF_8_NAME);
//
//        byte[] decoded;
//        try {
//            decoded = Base64.getDecoder().decode(base64Token);
//        } catch (IllegalArgumentException var7) {
//            throw new RuntimeException("客户端令牌解析失败");
//        }
//
//        String token = new String(decoded, Charsets.UTF_8_NAME);
//        int index = token.indexOf(StringPool.COLON);
//        if (index == -1) {
//            throw new RuntimeException("客户端令牌不合法");
//        } else {
//            return new String[]{token.substring(0, index), token.substring(index + 1)};
//        }
//    }
//}
